package cn.kent.high.juc.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * List源码阅读
 * 1.如何初始化list，初始化大小为多少，有大小限制吗
 *      初始化为new Object[0] ,也就是一位，网上加的时候是没有大小限制的
 * 2.如何保证线程安全，多线程下读写线程安全
 *      每次add都需要先获取独占锁 ReentrantLock 写入后再释放锁，从而保证了多线程读写安全
 * 3.如何保证使用迭代器时的list数据一致性
 *      首先,使用迭代器默认是没有加锁的，迭代器拿到的数据可能并不是最新的数据，拿到的只是一份快照。
 *      解决方法：参考Vector的迭代器，加synchronized监视器锁
 */
public class ListTest {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        list.add("hello");
        list.add("hello2");
        list.add("hello3");
        System.out.println(list);
        System.out.println(list.get(0));
        list.remove("hello");
        list.remove(0);
        list.set(0, "111");
        System.out.println(list);

        list.add("hello4");
        System.out.println("开始迭代器迭代");
        // 迭代器 - 弱一致性
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }


        // break+标签 指定跳出的循环体
        // if (1 == 1) {
        //     System.out.println("进入mm");
        //     for (int m = 0; m < 1000; m++) {
        //         System.out.println(m);
        //         mm:
        //         for (int i = 0; i < 100; i++) {
        //             for (int j = 0; j < 10; j++) {
        //                 if (j == 5) {
        //                     break mm;
        //                 }
        //             }
        //             System.out.println(i);
        //         }
        //     }
        // }


    }
}
